<?php
/**
 * 验证码绘制类
 */ 
class Authcode
{
    // 画布的宽度
    public $width                   =100;
    
    // 画布的长度
    public $height                  =28;
    
    // 画布的背景颜色
    public $background_color        =array(238,238,238);
    
    // 验证码的个数
    public $char_num                =4;
    
    // 验证码数字的个数
    public $char_inteagr_num        =1;
    
    //文件的路径
    public $char_file_url;
    
    // 验证码字体的大小
    public $font_size               =14;
    
    // 验证码倾斜的角度
    public $font_angle              =0;
    
    // 字体的x坐标
    public $font_x                  =10;
    
    // 字体的y坐标
    public $font_y                  =20;
    
    // 验证码字体的颜色
    public $font_color              =array(0,0,0);
    
    //验证码存储的session 名称
    public $session_save_name       = 'auth_code';
    
    //噪点的数量
    public $point_num               =10;
        
    //噪点的颜色
    public $point_color             =array(0,0,0);

    // 线的数量
    public $line_num                =2;
    
    //线的颜色
    public $line_color             =array(0,0,0);

    // CI 变量
    public $CI;
    
    public function __construct()
    {
        $this->CI =& get_instance();
        $this->CI->load->library('session');
        $this->char_file_url = realpath(realpath('../../'.dirname(__FILE__)).'publics/fonts/comic.ttf');
    }

    /**
     * 随机验证字符串构造方法
     */ 
    public function create_char()
    {
        // 字符串
        $str='abcdefjhigklfnopqrstuvxwyz';
        $str.=strtoupper($str);
        // 验证码字母的个数
        $num_char=$this->char_num   -   $this->char_inteagr_num;
        // 循环
        for($i=1;$i<=$num_char;$i++)
        {
            $char_auth[]=$str[rand(0,51)];
        }
        // 数字
        for($i=1;$i<=$this->char_inteagr_num;$i++)
        {
            $char_auth[]=rand(0,9);
        }
        // 将数组重新排序
        shuffle($char_auth);
        return  $str_char=implode('',$char_auth);
    }
    
    /**
     * 绘制验证码
     */
   public function draw()
   {
        // 新建画布
        $img=imagecreatetruecolor($this->width,$this->height);
        
        // 创建一个颜色资源（画布）
        $back_color=imagecolorallocate($img,$this->background_color[0],$this->background_color[1],$this->background_color[2]);
        
        // 填充画布颜色
        imagefill($img,0,0,$back_color);
        
        // 获取验证码内容
        $str=$this->create_char();


        // 利用session记住验证码内容
        $this->CI->session->set_userdata($this->session_save_name,$str);
        
        // 创建一个黑色的颜色资源（字体的颜色）
        $color_f=imagecolorallocate($img,$this->font_color[0],$this->font_color[1],$this->font_color[2]);
        //将验证码写入画布中
        imagefttext($img,$this->font_size,$this->font_angle,$this->font_x,$this->font_y,$color_f,$this->char_file_url,$str);
        
        // 噪点的颜色
        $p_color=imagecolorallocate($img,$this->point_color[0],$this->point_color[1],$this->point_color[2]);
        
        //增加噪点
        for($i=1;$i<=$this->point_num;$i++)
        {
            imagesetpixel($img,rand(0,$this->width),rand(0,$this->height),$p_color);
        }
        
        // 增加线段
        for($i=1;$i<=$this->line_num;$i++)
        {
            imageline($img,rand(0,$this->width),rand(0,$this->height),rand(0,$this->width),rand(0,$this->height),$p_color);
        }
        imagepng($img);
        
        // 释放资源
        imagedestroy($img);
   } 
}